﻿/**********************************************************************
 * @file   FITKSEAJunctionArea.h
 * @brief  SEA面连接
 * @author BaGuijun (baguijun@163.com)
 * @date   2024-11-11
 *********************************************************************/
#ifndef _FITKSEAJunctionArea_H
#define _FITKSEAJunctionArea_H

#include "FITKAcousticsModelAPI.h"
#include "FITKSEAAbstractJunction.h"

namespace Acoustics 
{
    /**
     * @brief  面连接渗漏
     * @author BaGuijun (baguijun@163.com)
     * @date   2024-11-11
     */
    struct FITKAcousticsModelAPI FITKSEAJunAreaLeakStr
    {
    public:
        enum LeakType
        {
            Rectangular,
            Circular,
            Slit,
            UserDefined,
        };
        //名称
        QString _name = "";
        //渗漏是否有效
        bool _isEnabled = true;
        //长是否可用
        bool _isLength = true;
        //长
        double _length = 0.0;
        //宽是否可用
        bool _isWidth = true;
        //宽
        double _width = 0.0;
        //半径是否可用
        bool _isRadius = false;
        //半径
        double _radius = 0.0;
        //深度是否可用
        bool _isDepth = false;
        //深度
        double _depth = 0.0;
        //区域是否可用
        bool _isArea = false;
        //区域
        double _area = 0.0;
        //频谱id是否可用
        bool _isTLSpectrumID = false;
        //频谱id
        int _TLSpectrumID = -1;
        //渗漏类型
        LeakType _type = LeakType::Rectangular;
        /**
         * @brief    计算区域大小
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void calculateArea();
    };
    /**
     * @brief  子系统连接数据信息
     * @author BaGuijun (baguijun@163.com)
     * @date   2024-11-11
     */
    struct  FITKSEAJunAreaConStr
    {
        //连接对象id
        int _subSysID = -1;
    };
    /**
     * @brief  SEA面连接
     * @author BaGuijun (baguijun@163.com)
     * @date   2024-11-11
     */
    class FITKAcousticsModelAPI FITKSEAJunctionArea:public FITKSEAAbstractJunction
    {
        FITKCLASS(Acoustics, FITKSEAJunctionArea);
        Q_OBJECT;
    public:
        /**
         * @brief  方向类型
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        enum JunctionAreaDirection
        {
            From,
            To,
        }; 
        Q_ENUM(JunctionAreaDirection);
    public:
        /**
         * @brief    构造函数
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        FITKSEAJunctionArea();
        /**
         * @brief    析构函数
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        virtual ~FITKSEAJunctionArea();
        /**
         * @brief    获取耦合对象类型   
         * @return   JunctionType       对象类型
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        virtual FITKAbstractJunction::JunctionType getJunctiontType()override;
        /**
         * @brief    获取是否使用共振
         * @return   bool           是否使用
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        bool getIsUseResonant();
        /**
         * @brief    设置是否使用共振
         * @param[i] isUse          是否使用
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void setIsUseResonant(bool isUse);
        /**
         * @brief    获取是否使用非共振
         * @return   bool           是否使用
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        bool getIsUseNonresonant();
        /**
         * @brief    设置是否使用非共振
         * @param[i] isUse          是否使用
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void setIsUseNonresonant(bool isUse);
        /**
         * @brief    获取是否使用渗漏
         * @return   bool          是否使用
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        bool getIsUseLeak();
        /**
         * @brief    设置是否使用渗漏
         * @param[i] isUse         是否使用
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void setIsUseLeak(bool isUse);
        /**
         * @brief    获取是否使用传输损耗
         * @return   bool          是否使用
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        bool getIsUseTransmissionLoss();
        /**
         * @brief    设置是否使用传输损耗
         * @param[i] isUse         是否使用
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void setIsUseTransmissionLoss(bool isUse);
        /**
         * @brief    设置传输损耗频谱id
         * @param[i] id          频谱id      
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void setSpectrum(int id);
        /**
         * @brief    获取传输损耗频谱id
         * @return   int         频谱id
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        int getSpectrum();
        /**
         * @brief    设置方向
         * @param[i] direction     方向
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void setDirection(JunctionAreaDirection direction);
        /**
         * @brief    获取方向
         * @return   JunctionAreaDirection   方向
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        JunctionAreaDirection getDirection();
        /**
         * @brief    获取耦合区域倍数
         * @return   double        倍数
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        double  getAcousticCouplingAreaX();
        /**
         * @brief    设置耦合区域倍数
         * @param[i] value         倍数
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void setAcousticCouplingAreaX(double value);
        /**
         * @brief    获取辐射区域倍数
         * @return   double        倍数
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        double  getAcousticRadiationAreaX();
        /**
         * @brief    设置辐射区域倍数
         * @param[i] value         倍数
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void setAcousticRadiationAreaX(double value);
        /**
         * @brief    获取辐射周长倍数
         * @return   double        倍数
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        double  getAcousticRadiationPerimaterX();
        /**
         * @brief    设置辐射周长倍数
         * @param[i] value         倍数
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void setAcousticRadiationPerimaterX(double value);
        /**
         * @brief    添加连接信息
         * @param[i] connection    连接信息
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void appendConnection(FITKSEAJunAreaConStr& connection);
        /**
         * @brief    获取连接信息板id
         * @return   int           板id
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-21
         */
        int getConnectionShellID();
        /**
         * @brief    替换所有连接信息
         * @param[i] connections   连接信息
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void replaceConnections(QList<FITKSEAJunAreaConStr>& connections);
        /**
         * @brief    获取所有连接信息
         * @return   QList<FITKSEAJunPointStr>    所有连接信息
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        QList<FITKSEAJunAreaConStr> getConnections();
        /**
         * @brief    添加渗漏信息
         * @param[i] leak    连接信息
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void appendLeak(FITKSEAJunAreaLeakStr& leak);
        /**
         * @brief    替换所有渗漏信息
         * @param[i] leaks   连接信息
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        void replaceLeaks(QList<FITKSEAJunAreaLeakStr>& leaks);
        /**
         * @brief    获取所有渗漏信息
         * @return   QList<FITKSEAJunPointStr>    所有连接信息
         * @author   BaGuijun (baguijun@163.com)
         * @date     2024-11-11
         */
        QList<FITKSEAJunAreaLeakStr> getLeaks();

    protected:
        /**
         * @brief    更新连接
         * @return   void
         * @author   liuzhonghua (liuzhonghuaszch@163.com)
         * @date     2025-01-21
         */
        virtual void updateConnect() override;

    protected:
        /**
         * @brief  是否使用共振
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        bool _isUseResonant = true;
        /**
         * @brief  是否使用非共振
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        bool _isUseNonresonant = true;
        /**
         * @brief  是否使用泄漏
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        bool _isUseLeak = true;
        /**
         * @brief  是否使用传输损耗
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        bool _isUseTransmissionLoss = false;
        /**
         * @brief  传输损耗频谱
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        int _spectrumID = -1;
        /**
         * @brief  方向
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        JunctionAreaDirection _direction = JunctionAreaDirection::From;
        /**
         * @brief  耦合区域倍数
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        double _acousticCouplingAreaX = 1;
        /**
         * @brief  辐射区域倍数
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        double _acousticRadiationAreaX = 1;
        /**
         * @brief  辐射周长倍数
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        double _acousticRadiationPerimaterX = 1;
        /**
         * @brief  连接信息
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        QList<FITKSEAJunAreaConStr> _connections = {};
        /**
         * @brief  渗透数据
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-11-11
         */
        QList<FITKSEAJunAreaLeakStr> _leaks = {};
    };
}

#endif
